/**-------------------------------------------------------------------------------------------
** Created by:          qinyx
** Last modified Date:  2014-02-28
** Last Version:        V1.00
** Descriptions:        STM32F407嵌入式实验箱
**
**
**-------------------------------------------------------------------------------------------*/
#include "LatticeData.h"
#include "Lattice.h"

//  行数据
unsigned char tab0[] = 
{
    0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 
    0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80,
    0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 
    0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00
}; 

                             
/******************************************************************************************
*函数名称：void RelayGpio_Init(void)
*
*入口参数：无
*
*出口参数：无
*
*功能说明：LED初始化
//HC595_RCK     PD2
//HC595_SCK     PF15
//HC595_SI      PG0
*******************************************************************************************/
void LatticeGpio_Init(void)
{    
    GPIO_InitTypeDef  GPIO_InitStructure;
    
    //  HC595_RCK(PD2)
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOD, &GPIO_InitStructure);
    
    //  HC595_SCK(PF15)
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOF, &GPIO_InitStructure);
    
    //  HC595_SI(PG0)
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOG, &GPIO_InitStructure);
    
    HC595_RCK_H;
    HC595_SCK_H;
    HC595_SI_H;
}


/*******************************************************************************
* 函 数 名         : HC595SendData
* 函数功能		   : 通过595发送四个字节的数据
* 输    入         : dat4：第四个595输出数值    列高八位
*                  * dat3: 第三个595输出数值    列低八位
*                  * dat2：第二个595输出数值    行高八位
*                  * dat1：第一个595输出数值    行低八位
* 输    出         : 无
*******************************************************************************/
void HC595SendData(unsigned char dat4, unsigned char dat3, unsigned char dat2, unsigned char dat1)
{  
	unsigned char i = 0;
	
	//  发送第四个数据
	for (i = 0; i < 8; i++)
	{
		if (dat4 & 0x80)                                                //  从高位到低位
        {
            HC595_SI_H; 
        }
        else
        {
            HC595_SI_L;
        }
		dat4 <<= 1;

		HC595_SCK_L;                                                    //  上升沿输出数据 
		HC595_SCK_H;    		
	}

	//  发送第三个数据
	for (i = 0; i < 8; i++)
	{
		if (dat3 & 0x80)                                                //  从高位到低位
        {
            HC595_SI_H; 
        }
        else
        {
            HC595_SI_L;
        }
		dat3 <<= 1;

		HC595_SCK_L;                                                    //  上升沿输出数据   
		HC595_SCK_H;    
	}

	//  发送第二个字节
	for (i = 0; i < 8; i++)
	{
		if (dat2 & 0x80)                                                //  从高位到低位
        {
            HC595_SI_H; 
        }
        else
        {
            HC595_SI_L;
        }
		dat2 <<= 1;

		HC595_SCK_L;                                                    //  上升沿输出数据 
		HC595_SCK_H; 
	}

	//  发送第一个字节
	for (i = 0; i < 8; i++)
	{
		if (dat1 & 0x80)                                                //  从高位到低位
        {
            HC595_SI_H; 
        }
        else
        {
            HC595_SI_L;
        }
		dat1 <<= 1;

		HC595_SCK_L;                                                    //  上升沿输出数据 
		HC595_SCK_H;    
	}
   
	//  输出
	HC595_RCK_L;        
	HC595_RCK_H;    
	HC595_RCK_L;        
}  

/**********************************************************************************************************
函数名称：void DiplayChineseCharacters(void)
函数说明：显示汉字
输入参数：无
输出参数：无
**********************************************************************************************************/
void DiplayChineseCharacters(void)
{
    unsigned char i = 0;
    unsigned int  j = 0;
    unsigned char k = 0;

    //  定义一个指针数据指向汉字
    unsigned char *p[] = { tab1, tab2, tab3, tab4};	

                           
    for (i = 0; i < 4; i++)		                                        //  总共4个字
    {
        for (j = 0; j < 5000; j++)	                                    //  肉眼可识别的停留时间
        {   
            for (k = 0; k < 16; k++)			                        //  显示一个字
            {	 						                
                HC595SendData((*(p[i] + 2*k + 1)), (*(p[i] + 2*k )),
                               tab0[2*k], tab0[2*k + 1]); 
            }

            HC595SendData(0xFF, 0xFF, 0, 0);				            //  清屏		 
        }
        
        delay_ms(500);
    }  							    		  
}
void shangjiantou(void)
{
	 unsigned char i = 0;
    unsigned int  j = 0;
    unsigned char k = 0;

    //  定义一个指针数据指向汉字
    unsigned char *p[] = { tab5};	

                           
    for (i = 0; i < 1; i++)		                                        //  总共4个字
    {
        for (j = 0; j < 5000; j++)	                                    //  肉眼可识别的停留时间
        {   
            for (k = 0; k < 16; k++)			                        //  显示一个字
            {	 						                
                HC595SendData((*(p[i] + 2*k + 1)), (*(p[i] + 2*k )),
                               tab0[2*k], tab0[2*k + 1]); 
            }
						HC595SendData(0xFF, 0xFF, 0, 0);				            //  清屏		 
            
        }
        delay_ms(1000);
    } 
			
}

void xiajiantou(void)
{
	 unsigned char i = 0;
    unsigned int  j = 0;
    unsigned char k = 0;

    //  定义一个指针数据指向汉字
    unsigned char *p[] = {tab6};	

                           
    for (i = 0; i < 1; i++)		                                        //  总共4个字
    {
        for (j = 0; j < 5000; j++)	                                    //  肉眼可识别的停留时间
        {   
            for (k = 0; k < 16; k++)			                        //  显示一个字
            {	 						                
                HC595SendData((*(p[i] + 2*k + 1)), (*(p[i] + 2*k )),
                               tab0[2*k], tab0[2*k + 1]); 
            }
						HC595SendData(0xFF, 0xFF, 0, 0);				            //  清屏		 
            
        }
        delay_ms(1000);
    } 
			
}
/**********************************************************************************************************
函数名称：void RefreshList(void)
函数说明：刷行
输入参数：无
输出参数：无
**********************************************************************************************************/
void RefreshLine(void)
{
    unsigned char i = 0;
    unsigned char temp = 0;
    
    temp = 0x01;
    for (i = 0; i < 8; i++)
    {
        HC595SendData(0x00, 0x00, 0x00, temp);
        temp <<= 1;
        delay_ms(100);
    }
    
    temp = 0x01;
    for (i = 0; i < 8; i++)
    {
        HC595SendData(0x00, 0x00, temp, 0x00);
        temp <<= 1;
        delay_ms(100);
    }
}

/**********************************************************************************************************
函数名称：void RefreshList(void)
函数说明：刷列
输入参数：无
输出参数：无
**********************************************************************************************************/
void RefreshList(void)
{
    unsigned char i = 0;
    unsigned char temp = 0;
    
    temp = 0x01;
    for (i = 0; i < 8; i++)
    {
        HC595SendData(0xFF, ~temp, 0xFF, 0xFF);
        temp <<= 1;
        delay_ms(100);
    }

    temp = 0x01;
    for (i = 0; i < 8; i++)
    {
        HC595SendData(~temp, 0xFF, 0xFF, 0xFF);
        temp <<= 1;
        delay_ms(100);
    }	
}
